﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using negocio.readOnly;
using negocio.servicios;
using negocio.entidades;

namespace web.form
{
    public partial class Venta : System.Web.UI.Page
    {


        protected void Page_Load(object sender, EventArgs e)
        {

            if (!Page.IsPostBack)
            {
                cargarCombo1();
                CargarGrilla();
                pnlPago.Visible = false;
                lbl_fecha.Text = DateTime.Now.ToShortDateString();

            }
        }

        private void cargarCombo1()
        {
            EmpleadoService tprod = new EmpleadoService();

            cmbEmpleado.DataSource = tprod.ObtenerActivos();
            cmbEmpleado.DataValueField = "Id";
            cmbEmpleado.DataTextField = "Nombre";
            cmbEmpleado.DataBind();
            cmbEmpleado.Items.Insert(0, " ");
        }

        private void CargarGrilla()
        {
            VentaService venService = new VentaService();
            List<ProductoVentaReadOnly> productos = venService.FindAllReadOnlies();
            grdProductos.DataSource = productos;
            string[] keys = new string[1];
            keys[0] = "ID";
            grdProductos.DataKeyNames = keys;
            grdProductos.DataBind();

        }

        protected void grdProductos_SelectedIndexChanged(object sender, EventArgs e)
        {
            ProductoService prodService = new ProductoService();
            Producto p = prodService.ontenerProductoPorId(int.Parse(grdProductos.SelectedValue.ToString()));
            lbl_producto.Text = p.Codigo + " Descripción: " + p.Descripcion;
        }

        protected void cmd_agregar_Click(object sender, EventArgs e)
        {
          
            ProductoService prodService = new ProductoService();
            Producto p = prodService.ontenerProductoPorId(int.Parse(grdProductos.SelectedValue.ToString()));
            List<object> lista = new List<object>();
            lista = cargarLista();

            int cant = int.Parse(txtCantidad.Text);

            var prod = new { id = p.Id, Codigo = p.Codigo, descripcion = p.Descripcion, precioVenta = p.PrecioVenta, cantidad = cant, total = cant * p.PrecioVenta };
            lista.Add(prod);
            grdVenta.DataSource = lista;
            string[] keys = new string[1];
            keys[0] = "ID";
            grdVenta.DataKeyNames = keys;
            grdVenta.DataBind();
            lbl_total.Visible = true;
            Label1.Visible = true;
            cmd_Confirmar.Visible = true;
            calcularTotal();
            limpiarCompra();
        }


        protected List<object> cargarLista()
        {
            List<object> lista = new List<object>();
            for (int i = 0; i < grdVenta.Rows.Count; i++)
            {
                ProductoService prodService = new ProductoService();
                Producto p = prodService.ontenerProductoPorId(int.Parse(grdVenta.Rows[i].Cells[0].Text));
                var prod = new { id = p.Id, Codigo = p.Codigo, descripcion = p.Descripcion, precioVenta = p.PrecioVenta, cantidad = int.Parse(grdVenta.Rows[i].Cells[4].Text), total = double.Parse(grdVenta.Rows[i].Cells[5].Text) };
                lista.Add(prod);
            }

            return lista;
        }

        protected void calcularTotal()
        {
            double total = 0;
            for (int i = 0; i < grdVenta.Rows.Count; i++)
			{
                total += double.Parse(grdVenta.Rows[i].Cells[5].Text);
			}
            lbl_total.Text = total.ToString();

        }
  

        protected void Filtrar_Click(object sender, EventArgs e)
        {
            VentaService venService = new VentaService();
            string filtro = txt_filtro.Text;
            List<ProductoVentaReadOnly> productos = venService.BuscarProducto(filtro);
            grdProductos.DataSource = productos;
            string[] keys = new string[1];
            keys[0] = "ID";
            grdProductos.DataKeyNames = keys;
            grdProductos.DataBind();

        }

        protected void cmd_Confirmar_Click(object sender, EventArgs e)
        {
            PnlCompra.Visible = false;
            pnlPago.Visible = true;
            lbl_totalAPagar.Text = lbl_total.Text;
           
        }

        protected void cargarCombo()
        {
            VentaService venService = new VentaService();
            cmb_tarjetas.DataSource = venService.cargarComboTarjeta();
            cmb_tarjetas.DataValueField = "Id";
            cmb_tarjetas.DataTextField = "Nombre";
            cmb_tarjetas.DataBind();
            cmb_tarjetas.Items.Insert(0, "");

        }

        protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (rbl_formaPago.SelectedValue == "Tarjeta")
            {
                cargarCombo();
                cmb_tarjetas.Enabled = true;
                txtCuotas.Text = "";
            }
            else
            {
                cmb_tarjetas.Enabled = false;
                cmb_tarjetas.SelectedValue = "";
            }

        }

        protected void cmd_Aceptar_Click(object sender, EventArgs e)
        {

            calcularMontoRestante();
            limpiarPago();
        }

        protected void limpiarCompra()
        {
            txtCantidad.Text = "";
            lbl_producto.Text = "";
        }

        protected void limpiarPago()
        {
            txtCuotas.Text = "1";
            txtMonto.Text = "";
            cmb_tarjetas.SelectedValue = "";
        }

        private void calcularMontoRestante()
        {
            if (double.Parse(txtMonto.Text) > double.Parse(lbl_totalAPagar.Text))
            {
                txtMonto.Text = "Excede cantidad";
            }
            else
            {
                lbl_totalAPagar.Text = (double.Parse(lbl_totalAPagar.Text) - double.Parse(txtMonto.Text)).ToString();
                if (double.Parse(lbl_totalAPagar.Text)==0)
                    cmd_ConfirmVenta.Visible = true;

                agregarItemAPago();
                
            }
        }

        private void agregarItemAPago()
        {
            List<object> lista = new List<object>();
            lista = cargarListaPago();
            string tarjeta;
            if (cmb_tarjetas.SelectedValue== "")
                tarjeta = "";
            else
                tarjeta = cmb_tarjetas.SelectedValue.ToString();        
                

            var prod = new { formaPago = rbl_formaPago.SelectedValue, tar = tarjeta, monto = double.Parse(txtMonto.Text), cuota= int.Parse(txtCuotas.Text)};
            lista.Add(prod);
            grdPago.DataSource = lista;
            grdPago.DataBind();
        
        }

        private List<object> cargarListaPago()
        {
            List<object> lista = new List<object>();
            for (int i = 0; i < grdPago.Rows.Count; i++)
            {
                String fpago=grdPago.Rows[i].Cells[0].Text;
                string tarjeta;

                if (grdPago.Rows[i].Cells[1].Text == "&nbsp;")
                    tarjeta = "";
                else
                    tarjeta = grdPago.Rows[i].Cells[1].Text;

                double m = double.Parse(grdPago.Rows[i].Cells[2].Text);
                int c = int.Parse(grdPago.Rows[i].Cells[3].Text);

                var prod = new { formaPago = fpago, tar = tarjeta, monto = m , cuota=c};
                lista.Add(prod);
            }

            return lista;
        }

        protected void cmd_ConfirmVenta_Click(object sender, EventArgs e)
        {
            VentaService venS= new VentaService();
            DateTime fecha=DateTime.Parse(lbl_fecha.Text);
            int idempleado = int.Parse(cmbEmpleado.SelectedValue);
            double monto= double.Parse(lbl_total.Text);
            venS.registrarVenta(fecha,idempleado, monto, productosVendidos(), pagosRealizados());
            Response.Redirect("Venta.aspx");
        
        }

        protected List<DetalleVenta> productosVendidos()
        {
            List<DetalleVenta> lista = new List<DetalleVenta>();
            for (int i = 0; i < grdVenta.Rows.Count; i++)
            {
                DetalleVenta dv = new DetalleVenta();
                dv.IdProducto = int.Parse(grdVenta.Rows[i].Cells[0].Text);
                dv.PrecioVenta = double.Parse(grdVenta.Rows[i].Cells[3].Text);
                dv.Cantidad = int.Parse(grdVenta.Rows[i].Cells[4].Text);
                lista.Add(dv);
            }

            return lista; 
        }

        protected List<DetallePago> pagosRealizados()
        {
            List<DetallePago> lista = new List<DetallePago>();
            for (int i = 0; i < grdPago.Rows.Count; i++)
            {
                DetallePago dp = new DetallePago();
                dp.TipoPago = grdPago.Rows[i].Cells[0].Text;
                if (grdPago.Rows[i].Cells[1].Text == "&nbsp;")
                    dp.IdTarjeta = null;
                else
                    dp.IdTarjeta = int.Parse(grdPago.Rows[i].Cells[1].Text);

                dp.Monto= double.Parse(grdPago.Rows[i].Cells[2].Text);
                dp.CantidadCuotas = int.Parse(grdPago.Rows[i].Cells[3].Text);
                lista.Add(dp);
            }

            return lista; 
        }

        protected void grdProductos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdProductos.PageIndex = e.NewPageIndex;
            CargarGrilla();
        }


 


    } 
}